package model;


import java.util.ArrayList;
import java.util.List;
import java.util.Date;

import junit.framework.TestCase;
import static org.mockito.Mockito.*;

public class CFPTestCase extends TestCase {

	private CFP cfp;
	private Usuario mockAutor = mock(Usuario.class);
	private List<String> areasInteres = new ArrayList<String>();
	private List<Usuario> listaDeRevisores = new ArrayList<Usuario>();
	private Date mockFechaRecepcion = mock(Date.class);
	private Date mockFechaRevision = mock(Date.class);

	protected void setUp() throws Exception {

		Usuario mockRol = mock(Usuario.class);
		this.areasInteres.add("l");
		this.listaDeRevisores.add(mockRol);
		this.cfp = new CFP(this.mockAutor, "PYTHON", this.areasInteres,
				this.mockFechaRecepcion, this.mockFechaRevision,
				this.listaDeRevisores);

	}

	public void testConstructor() {

		assertEquals(mockAutor, cfp.getAutor());
		assertEquals("PYTHON", cfp.getNombre());
		assertEquals(mockFechaRecepcion, cfp.getFechaTopeDeRecepcion());
		assertEquals(mockFechaRevision, cfp.getFechaTopeDeRevision());
		assertTrue(cfp.getAreasDeInteres().containsAll(this.areasInteres));
		assertTrue(cfp.getListaDeAutores().isEmpty());
		assertTrue(cfp.getListaDeRevisores().containsAll(this.listaDeRevisores));
		assertTrue(cfp.getTrabajos().isEmpty());
		assertNull(cfp.getTemporizador());

	}

	public void testActivarTemporizador() {

		SistemaWeb sistema = mock(SistemaWeb.class);
		this.cfp.activarTemporizador(mockFechaRecepcion, sistema, this.cfp);

		assertNotNull(cfp.getTemporizador());
		assertTrue(cfp.getTemporizador().getEstaActivado());

	}

	public void testAgregarTrabajoComoAutor() {

		Usuario mockUsuario = mock(Usuario.class);
		Trabajo mockTp = mock(Trabajo.class);
		this.cfp.agregarTrabajo(mockTp, mockUsuario);
		assertTrue(this.cfp.getTrabajos().contains(mockTp));
		verify(mockUsuario).agregarTrabajo(mockTp, this.cfp);
		assertTrue(this.cfp.getListaDeAutores().contains(mockUsuario));
	}
	
	public void testAgregarTrabajoComoRevisor(){
		
		Usuario mockUsuario = mock(Usuario.class);
		Trabajo mockTp = mock(Trabajo.class);
		this.cfp.getListaDeRevisores().add(mockUsuario);
		this.cfp.agregarTrabajo(mockTp, mockUsuario);
		assertFalse(this.cfp.getTrabajos().contains(mockTp));
		assertTrue(this.cfp.getListaDeAutores().isEmpty());
		assertTrue(this.cfp.getListaDeRevisores().contains(mockUsuario));
		
	}

	public void testCaducoFechaDeEnvioTrue() {

		this.cfp.setFechaTopeDeRecepcion(new Date(2011 - 1900, 1, 7));

		assertTrue(this.cfp.caducoFechaDeEnvío());

	}

	public void testCaducoFechaDeEnvioFalse() {

		this.cfp.setFechaTopeDeRecepcion(new Date(2013 - 1900, 1, 7));

		assertFalse(this.cfp.caducoFechaDeEnvío());

	}

	public void testPuedeEnviarTpsTrue() {

		Usuario mockUser = mock(Usuario.class);

		assertTrue(this.cfp.puedeEnviarTps(mockUser));

	}

	public void testPuedeEnviarTpsFalse() {

		Usuario mockUser = mock(Usuario.class);
		
		this.cfp.getListaDeRevisores().add(mockUser);

		assertFalse(this.cfp.puedeEnviarTps(mockUser));

	}
	
}
